//COGS 896
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <cassert>

using namespace std;

struct Point{
    double x,y;
    Point(double x=0,double y=0):x(x),y(y){}
    const bool operator < (const Point &p) const;
    const Point operator - (const Point &p) const{return Point(x-p.x,y-p.y);}
    const Point operator * (const Point &p) const{return Point(x*p.x,y*p.y);}
    const bool operator != (const Point &p) const{return x!=p.x||y!=p.y;}
};

const int maxn=10005;
const double eps=1e-7;
Point pts[maxn];
int sta[maxn],top;

inline double cross(const Point &p,const Point &q){
    return p.x*q.y-p.y*q.x;
}
inline double dis(const Point &p,const Point &q){
    return (p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y);
}
const bool Point::operator < (const Point &p) const{
    double t=cross(*this-pts[0],p-pts[0]);
    if(t>-eps&&t<eps) return dis(pts[0],*this)<dis(pts[0],p);
    else return t>0;
}

inline void graham(const int &n){
    int k=0;
    for(int i=1;i<n;i++) if(pts[i].x<pts[k].x||(pts[i].x==pts[k].x&&pts[i].y<pts[k].y)) k=i;
    swap(pts[k],pts[0]);
    sort(pts+1,pts+n);
    top=2;sta[0]=0;sta[1]=1;
    for(int i=2;i<n;i++){
        while(top>1&&cross(pts[sta[top-1]]-pts[sta[top-2]],pts[i]-pts[sta[top-1]])<=0) top--;
        sta[top++]=i;
    }
}

int main(){
    int n;
    double ans;

    freopen("fc.in","r",stdin);
    freopen("fc.out","w",stdout);

    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%lf%lf",&pts[i].x,&pts[i].y);
    graham(n);
    ans=0;
    //for(int i=0;i<top;i++) printf("(%.2f,%.2f)\n",pts[sta[i]].x,pts[sta[i]].y);putchar('\n');
    for(int i=0;i<top-1;i++) {
        assert(pts[sta[i]]!=pts[sta[i+1]]);
        ans+=sqrt(dis(pts[sta[i]],pts[sta[i+1]]));
    }
    ans+=sqrt(dis(pts[sta[top-1]],pts[sta[0]]));
    printf("%.2f\n",ans);
    return 0;
}

